/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package blink.model;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.*;
import java.lang.ref.SoftReference;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 * Un stimulus est une image qui pourra être affichée dans un essai. Cette
 * classe permet de charger l'image enregistrée dans le fichier encapsulé. Elle
 * dipose également d'un mécanisme de Serialization spécifique
 *
 * @author Jerome David
 */
public class Stimulus implements Serializable {

    private transient SoftReference<Image> imgRef; //reference vers une image 
    private File imgFile; //le fichier image

    public Stimulus(File imgFile) throws IOException {
        this.imgFile = imgFile;
    }

    /**
     * Retourne une image affichable dans un composant graphique. Si la hauteur
     * et largeur passées en argument sont -1, alors l'image au dimension
     * originale est retournée. Si l'un des deux paramètre est -1 alors il sera
     * calculé à partir de l'autre pour que l'image garde ses proportions
     * originales.
     *
     * @param width la largeur souhaitée. -1 si calcul auto.
     * @param height la hauteur souhaitée. -1 si calcul auto.
     * @return l'image affichable aux dimensions souhaitées ou calculées
     */
    public Image getImg(int width, int height) {
        //Image img = null;
        if (imgRef == null || imgRef.get() == null || imgRef.get().getWidth(null) != width || imgRef.get().getHeight(null) != height) {
            try {
                BufferedImage img = ImageIO.read(imgFile);
                
                if (height == -1 && width > -1) {
                    height = (img.getHeight(null) * width) / img.getWidth(null);
                } else if (width == -1 && height > -1) {
                    width = (img.getWidth(null) * height) / img.getHeight(null);
                }
                if (height != -1 && (height != img.getHeight(null) || width != img.getWidth(null))) {
                    
                     BufferedImage bufimg = new BufferedImage(width, height,
                     BufferedImage.TYPE_INT_ARGB); Graphics2D g2 =
                     bufimg.createGraphics();
                     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                     g2.drawImage(img, 0, 0, width, height, null);
                     g2.dispose();
                     img=bufimg;
                     
                       
                    imgRef = new SoftReference<Image>(img);// img.getScaledInstance(width, height, BufferedImage.SCALE_DEFAULT));
                }

            } catch (IOException ex) {
                Logger.getLogger(Stimulus.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }


        }




        return imgRef.get();
    }

    /*
     * public void setImg(BufferedImage img) { this.img = img; }
     */
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
        FileInputStream fis = new FileInputStream(imgFile);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[512];
        int read = 0;
        while ((read = fis.read(buf)) != -1) {
            bos.write(buf, 0, read);
        }
        out.writeInt(bos.size());
        out.write(bos.toByteArray());
        bos.close();
        fis.close();



    }

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
        int size = in.readInt();
        byte[] imgData = new byte[size];
        in.readFully(imgData);
        imgFile = File.createTempFile("img", ".jpg");
        FileOutputStream fos = new FileOutputStream(imgFile);
        fos.write(imgData);
        fos.close();
        //System.out.println("---------"+imgFile+"------------");
    }
}
